package com.woniuxy.rabbitmq.returns;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author: 15489  <br/>
 * Date: 2022/4/2:15:02  <br/>
 * Description:
 */

public class ReturnRouteProducter {
    public static void main(String[] args) throws IOException, TimeoutException {
//        1:创建工厂:创建rabbitmq的连接对象
        ConnectionFactory factory=new ConnectionFactory();
//        2:设置连接参数
        factory.setHost("192.168.58.128"); //ip
        factory.setPort(5672);             //端口
        factory.setUsername("admin");       //账号
        factory.setPassword("admin");       //密码
        factory.setVirtualHost("/test");   // 虚拟机名字
//        3:创建连接
        Connection connection=factory.newConnection();
        System.out.println(connection);

//        4:发消息
//        4.1 创建一个通道
        Channel channel = connection.createChannel();

//       7.1 需要添加监听器 当消息无法到达交换机或者无法被路由（没匹配上）是会调用该方法处理该消息
        channel.addReturnListener(new ReturnListener() {
//            参数1:返回码
//            参数2:返回的内容
//            参数3：交换机的名字
//            参数4:路由名字
//            参数5：发送消息时设置的一些参数
//            参数6：消息
            @Override
            public void handleReturn(int i, String s, String s1, String s2, AMQP.BasicProperties basicProperties, byte[] bytes) throws IOException {
                System.out.println(i);
                System.out.println(s);
                System.out.println(s1);
                System.out.println(s2);
                System.out.println(basicProperties);
                System.out.println(new String(bytes,"UTF-8"));
//            处理无法路由 消息无法从交换机转发到消息队列
//                1：将这个消息作为死信处理
//                2：将消息发送给另外一个mq

            }
        });

//      5:创建使用交换机
//        参数一 交换机的名字
//        参数二 交换机的类型    direct 路由模式采用的交换机
        channel.exchangeDeclare("route_exchange_a","direct") ;
        for (int i=0;i<10;i++){
//            参数一 交换机的名字
//            参数二 ：路由的名字
//            参数三：开启return模式  只有开启之后，当消息无法到达交换机 路由时才会被return的监听器监听到
            channel.basicPublish("route_exchange_a","green",true,null,(i+"").getBytes());
        }
//        channel.close();
//        connection.close();

    }
}
